草庐IT

Python NotImplemented 常量

全部标签

c++ - 如何检测是否有func。是一个常量?并标记其他功能。 constexpr 取决于它?

假设我有一些函数模板f1:templateintf1(inti,intj)noexcept{returni+j+f2(i,j);}有没有办法确定f2(i,j)可以是constexpr.(无论是函数还是仿函数)等等标记f1作为constexpr也是?我正在考虑如何在这里使用SFINAE,但没有找到如何检测constexpr使用typetraits 最佳答案 您可以将f1标记为constexpr。templateconstexprintf1(inti,intj)noexcept{returni+j+f2(i,j);}模板函数f1将是co

c++ - 为什么析构函数可以改变常量对象的状态?

我知道常量对象的状态是不允许修改的,但是为什么析构函数可以改变这个状态呢?classA{public:~A(){i=2;//?}voidtest()const{//i=1;//Notallowed}inti=0;};intmain(){constAo;o.test();} 最佳答案 whycanthedestructorchangethisstate?因为在析构函数中改变对象的状态可能很有用,无论它们是否为const。因为封装无关紧要。生命周期已经结束,所以无论如何都没有人可以看到处于修改状态的对象。因为标准(引用草案)是这样说的:

c++ - const_cast 和 std::move 从非引用中删除常量

我有一个无法修改的外部库。该库声明了一个模板函数,由于某种原因返回const非引用对象:templateconstCfoo();我还有另一个无法修改的外部库。该库声明了一个不可复制的类,并且仅具有来自非常量对象的move构造函数:structbar{bar();bar(constbar&)=delete;bar(bar&&);};现在我需要使用foo.一个简单的用法:barbuz(){returnfoo();}失败main.cpp:Infunction'barbuz()':main.cpp:13:21:error:useofdeletedfunction'bar::bar(constb

c++ - 当 x 为 const int[] 时,x[0] == 1 C++11 中的常量表达式?

以下C++11程序是否格式错误?constintx[]={1,2,3};static_assert(x[0]==1,"yay");intmain(){}gcc和clang似乎都这么认为,但是为什么x[0]==1不是一个常量表达式呢?x[0]==1subscriptoperator*(x+0)==1array-to-pointerconversion(int*p=x)*(p+0)==1pointeraddition*p==1indirection(lvaluey=x[0])y==1lvalue-to-rvalueconversion:anon-volatileglvalue(yes,x[

c++ - 为什么 0 == ("abcde"+1) 不是常量表达式?

为什么下面的代码不能编译?//source.cppintmain(){constexprboolresult=(0==("abcde"+1));}编译命令:$g++-std=c++14-csource.cpp输出:source.cpp:Infunction‘intmain()’:source.cpp:4:32:error:‘((((constchar*)"abcde")+1u)==0u)’isnotaconstantexpressionconstexprboolresult=(0==("abcde"+1));~~~^~~~~~~~~~~~~~~我正在使用gcc6.4。

c++ - 为什么在 C++11 中取消了对逗号运算符在常量表达式中的限制?

最近当answeringaquestion我意识到C++11中的常量表达式中允许使用逗号运算符只要表达式被()包围,例如:inta[(1,2)];PreC++11禁止在常量表达式中使用逗号运算符,来自C++11标准草案前的标准部分5.19常量表达式,它说(强调我的):[...]Inparticular,exceptinsizeofexpressions,functions,classobjects,pointers,orreferencesshallnotbeused,andassignment,increment,decrement,function-call,orcommaoper

c++ - 常量数组

这是一个不错的旧C数组:inta[10];这是一个很好的旧C数组,它是const:constintb[10];在C++中,似乎有两种方法可以定义std::array即const:std::arrayc;conststd::arrayd;这两个定义是等价的吗?如果是这样,惯用语是什么?如果不是,有什么区别? 最佳答案 好吧,原来的constintb[10];仅在您可以初始化数组时才有用,因此两个std::array示例都没有在实践中工作。1:std::arrayc;这是最接近constintc[10];。问题是它没有默认构造函数,并且

C++:常量正确性和指针参数

我知道const指针可以通过几种方式声明:constint*intPtr1;//Declaresapointerthatcannotbechanged.int*constintPtr2;//Declaresapointerwhosecontentscannotbechanged.//EDIT:THEABOVECLAIMSAREINCORRECT,PLEASEREADTHEANSWERS.但是在函数参数的上下文中相同的原则呢?我认为以下是多余的:voidsomeFunc1(constint*arg);voidsomeFunc2(int*arg);由于someFunc1和2对指针本身进行了

C++:将枚举作为值还是作为常量引用传递更好?

这里有两个相关的问题:A)枚举是如何实现的?例如,如果我有代码:enummyType{TYPE_1,TYPE_2};实际发生了什么?我知道您可以将TYPE_1和TYPE_2视为整数,但它们实际上只是整数吗?B)基于该信息,假设传入的枚举不需要更改,将myType作为值还是作为const引用传递给函数是否更有意义?例如,哪个是更好的选择:voidmyFunction(myTypex){//somestuff}或voidmyFunction(constmyType&x){//somestuff} 最佳答案 速度方面,几乎可以肯定这无关紧

c++ - 取消引用指向常量的指针

假设我们有一个名为object的类。intmain(){objecta;constobject*b=&a;(*b);}问题:b是一个指向const的指针,但它所指向的对象实际上并不是一个常量对象。我的问题是,当我们取消引用指针“b”时,为什么我们会得到一个常量对象,而不是它实际指向的是普通的非常量对象。 最佳答案 因为这就是内置解引用运算符*在C++中的工作方式。如果你取消引用T*类型的指针,你会得到一个T类型的左值。在您的情况下,T是constobject。*操作符和指针本身都不关心(或知道)指针指向的对象实际上是非常量的。在C+